home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / yacc / flexyacc / aflex.lha / aflex / src / genB.a < prev    next >
Text File  |  1992-12-29  |  19KB  |  679 lines

  1. -- Copyright (c) 1990 Regents of the University of California.
  2. -- All rights reserved.
  3. --
  4. -- This software was developed by John Self of the Arcadia project
  5. -- at the University of California, Irvine.
  6. --
  7. -- Redistribution and use in source and binary forms are permitted
  8. -- provided that the above copyright notice and this paragraph are
  9. -- duplicated in all such forms and that any documentation,
  10. -- advertising materials, and other materials related to such
  11. -- distribution and use acknowledge that the software was developed
  12. -- by the University of California, Irvine.  The name of the
  13. -- University may not be used to endorse or promote products derived
  14. -- from this software without specific prior written permission.
  15. -- THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  16. -- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  17. -- WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  18.  
  19. -- TITLE scanner generation
  20. -- AUTHOR: John Self (UCI)
  21. -- DESCRIPTION
  22. -- NOTES does actual generation (writing) of output aflex scanners
  23. -- $Header: /dc/uc/self/arcadia/aflex/ada/src/RCS/genB.a,v 1.25 1992/10/02 23:08:41 self Exp self $ 
  24.  
  25. with MISC_DEFS, TEXT_IO, MISC, INT_IO, TSTRING, PARSE_TOKENS; 
  26. with SCANNER, SKELETON_MANAGER, EXTERNAL_FILE_MANAGER; use MISC_DEFS, TEXT_IO, 
  27.   TSTRING, PARSE_TOKENS, EXTERNAL_FILE_MANAGER; 
  28.  
  29. package body GEN is 
  30.   INDENT_LEVEL : INTEGER := 0;  -- each level is 4 spaces
  31.  
  32.   MAX_SHORT    : constant INTEGER := 32767; 
  33.   procedure INDENT_UP is 
  34.   begin
  35.     INDENT_LEVEL := INDENT_LEVEL + 1; 
  36.   end INDENT_UP; 
  37.   pragma INLINE(INDENT_UP); 
  38.   procedure INDENT_DOWN is 
  39.   begin
  40.     INDENT_LEVEL := INDENT_LEVEL - 1; 
  41.   end INDENT_DOWN; 
  42.   pragma INLINE(INDENT_DOWN); 
  43.  
  44.   procedure SET_INDENT(INDENT_VAL : in INTEGER) is 
  45.   begin
  46.     INDENT_LEVEL := INDENT_VAL; 
  47.   end SET_INDENT; 
  48.  
  49.  
  50.   -- indent to the current level
  51.  
  52.   procedure DO_INDENT is 
  53.     I : INTEGER := INDENT_LEVEL*4; 
  54.   begin
  55.     while (I >= 8) loop
  56.       TEXT_IO.PUT(ASCII.HT); 
  57.       I := I - 8; 
  58.     end loop; 
  59.  
  60.     while (I > 0) loop
  61.       TEXT_IO.PUT(' '); 
  62.       I := I - 1; 
  63.     end loop; 
  64.   end DO_INDENT; 
  65.  
  66.   -- generate the code to keep backtracking information
  67.  
  68.   procedure GEN_BACKTRACKING is 
  69.   begin
  70.     if (NUM_BACKTRACKING = 0) then 
  71.       return; 
  72.     end if; 
  73.  
  74.     INDENT_PUTS("if ( yy_accept(yy_current_state) /= 0 ) then"); 
  75.  
  76.     INDENT_UP; 
  77.     INDENT_PUTS("yy_last_accepting_state := yy_current_state;"); 
  78.     INDENT_PUTS("yy_last_accepting_cpos := yy_cp;"); 
  79.     INDENT_DOWN; 
  80.     INDENT_PUTS("end if;"); 
  81.   end GEN_BACKTRACKING; 
  82.  
  83.   -- generate the code to perform the backtrack
  84.  
  85.   procedure GEN_BT_ACTION is 
  86.   begin
  87.     if (NUM_BACKTRACKING = 0) then 
  88.       return; 
  89.     end if; 
  90.  
  91.     SET_INDENT(4); 
  92.  
  93.     INDENT_PUTS("when 0 => -- must backtrack"); 
  94.     INDENT_PUTS("-- undo the effects of YY_DO_BEFORE_ACTION"); 
  95.     INDENT_PUTS("yy_ch_buf(yy_cp) := yy_hold_char;"); 
  96.  
  97.     if (FULLTBL) then 
  98.       INDENT_PUTS("yy_cp := yy_last_accepting_cpos + 1;"); 
  99.     else 
  100.  
  101.       -- backtracking info for compressed tables is taken \after/
  102.       -- yy_cp has been incremented for the next state
  103.       INDENT_PUTS("yy_cp := yy_last_accepting_cpos;"); 
  104.     end if; 
  105.  
  106.     INDENT_PUTS("yy_current_state := yy_last_accepting_state;"); 
  107.     INDENT_PUTS("goto next_action;"); 
  108.     TEXT_IO.NEW_LINE; 
  109.  
  110.     SET_INDENT(0); 
  111.   end GEN_BT_ACTION; 
  112.  
  113.   -- generate equivalence-class table
  114.  
  115.   procedure GENECS is 
  116.     I       : INTEGER; 
  117.     NUMROWS : INTEGER; 
  118.     use TEXT_IO; 
  119.   begin
  120.     TEXT_IO.PUT("yy_ec : constant array(CHARACTER'FIRST.."); 
  121.     TEXT_IO.PUT_LINE("CHARACTER'LAST) of short :="); 
  122.     TEXT_IO.PUT_LINE("    (   0,"); 
  123.  
  124.     for CHAR_COUNT in 1 .. CSIZE loop
  125.       if (CASEINS and ((CHAR_COUNT >= CHARACTER'POS('A')) and (CHAR_COUNT <= 
  126.         CHARACTER'POS('Z')))) then 
  127.         ECGROUP(CHAR_COUNT) := ECGROUP(MISC.CLOWER(CHAR_COUNT)); 
  128.       end if; 
  129.  
  130.       ECGROUP(CHAR_COUNT) := abs(ECGROUP(CHAR_COUNT)); 
  131.       MISC.MKDATA(ECGROUP(CHAR_COUNT)); 
  132.     end loop; 
  133.  
  134.     MISC.DATAEND; 
  135.  
  136.     if (TRACE) then 
  137.       TEXT_IO.NEW_LINE(STANDARD_ERROR); 
  138.       TEXT_IO.NEW_LINE(STANDARD_ERROR); 
  139.       TEXT_IO.PUT(STANDARD_ERROR, "Equivalence Classes:"); 
  140.       TEXT_IO.NEW_LINE(STANDARD_ERROR); 
  141.       TEXT_IO.NEW_LINE(STANDARD_ERROR); 
  142.       NUMROWS := (CSIZE + 1)/8; 
  143.  
  144.       for J in 1 .. NUMROWS loop
  145.         I := J; 
  146.         while (I <= CSIZE) loop
  147.           TSTRING.PUT(STANDARD_ERROR, MISC.READABLE_FORM(CHARACTER'VAL(I))); 
  148.           TEXT_IO.PUT(STANDARD_ERROR, " = "); 
  149.           INT_IO.PUT(STANDARD_ERROR, ECGROUP(I), 1); 
  150.           TEXT_IO.PUT(STANDARD_ERROR, "   "); 
  151.           I := I + NUMROWS; 
  152.         end loop; 
  153.         TEXT_IO.NEW_LINE(STANDARD_ERROR); 
  154.       end loop; 
  155.     end if; 
  156.   end GENECS; 
  157.  
  158.   -- generate the code to find the action number
  159.  
  160.   procedure GEN_FIND_ACTION is 
  161.   begin
  162.     INDENT_PUTS("yy_act := yy_accept(yy_current_state);"); 
  163.   end GEN_FIND_ACTION; 
  164.  
  165.   -- genftbl - generates full transition table
  166.  
  167.   procedure GENFTBL is 
  168.     END_OF_BUFFER_ACTION : INTEGER := NUM_RULES + 1; 
  169.     -- *everything* is done in terms of arrays starting at 1, so provide
  170.     -- a null entry for the zero element of all C arrays
  171.     use TEXT_IO; 
  172.   begin
  173.     TEXT_IO.PUT("yy_accept : constant array(0.."); 
  174.     INT_IO.PUT(LASTDFA, 1); 
  175.     TEXT_IO.PUT_LINE(") of short :="); 
  176.     TEXT_IO.PUT_LINE("    (   0,"); 
  177.  
  178.     DFAACC(END_OF_BUFFER_STATE).DFAACC_STATE := END_OF_BUFFER_ACTION; 
  179.  
  180.     for I in 1 .. LASTDFA loop
  181.       declare
  182.         ANUM : INTEGER := DFAACC(I).DFAACC_STATE; 
  183.       begin
  184.         MISC.MKDATA(ANUM); 
  185.  
  186.         if (TRACE and (ANUM /= 0)) then 
  187.           TEXT_IO.PUT(STANDARD_ERROR, "state # "); 
  188.           INT_IO.PUT(STANDARD_ERROR, I, 1); 
  189.           TEXT_IO.PUT(STANDARD_ERROR, " accepts: ["); 
  190.           INT_IO.PUT(STANDARD_ERROR, ANUM, 1); 
  191.           TEXT_IO.PUT(STANDARD_ERROR, "]"); 
  192.           TEXT_IO.NEW_LINE(STANDARD_ERROR); 
  193.         end if; 
  194.       end; 
  195.     end loop; 
  196.  
  197.     MISC.DATAEND; 
  198.  
  199.     if (USEECS) then 
  200.       GENECS; 
  201.     end if; 
  202.  
  203.   -- don't have to dump the actual full table entries - they were created
  204.   -- on-the-fly
  205.   end GENFTBL; 
  206.  
  207.   -- generate the code to find the next compressed-table state
  208.  
  209.   procedure GEN_NEXT_COMPRESSED_STATE is 
  210.   begin
  211.     if (USEECS) then 
  212.       INDENT_PUTS("yy_c := yy_ec(yy_ch_buf(yy_cp));"); 
  213.     else 
  214.       INDENT_PUTS("yy_c := yy_ch_buf(yy_cp);"); 
  215.     end if; 
  216.  
  217.     -- save the backtracking info \before/ computing the next state
  218.     -- because we always compute one more state than needed - we
  219.     -- always proceed until we reach a jam state
  220.     GEN_BACKTRACKING; 
  221.  
  222.     INDENT_PUTS(
  223.       "while ( yy_chk(yy_base(yy_current_state) + yy_c) /= yy_current_state ) loop"
  224.       ); 
  225.     INDENT_UP; 
  226.     INDENT_PUTS("yy_current_state := yy_def(yy_current_state);"); 
  227.  
  228.     if (USEMECS) then 
  229.  
  230.       -- we've arrange it so that templates are never chained
  231.       -- to one another.  This means we can afford make a
  232.       -- very simple test to see if we need to convert to
  233.       -- yy_c's meta-equivalence class without worrying
  234.       -- about erroneously looking up the meta-equivalence
  235.       -- class twice
  236.       DO_INDENT; 
  237.  
  238.       -- lastdfa + 2 is the beginning of the templates
  239.       TEXT_IO.PUT("if ( yy_current_state >= "); 
  240.       INT_IO.PUT(LASTDFA + 2, 1); 
  241.       TEXT_IO.PUT_LINE(" ) then"); 
  242.  
  243.       INDENT_UP; 
  244.       INDENT_PUTS("yy_c := yy_meta(yy_c);"); 
  245.       INDENT_DOWN; 
  246.       INDENT_PUTS("end if;"); 
  247.     end if; 
  248.  
  249.     INDENT_DOWN; 
  250.     INDENT_PUTS("end loop;"); 
  251.  
  252.     INDENT_PUTS("yy_current_state := yy_nxt(yy_base(yy_current_state) + yy_c);")
  253.       ; 
  254.     INDENT_DOWN; 
  255.   end GEN_NEXT_COMPRESSED_STATE; 
  256.  
  257.   -- generate the code to find the next match
  258.  
  259.   procedure GEN_NEXT_MATCH is 
  260.   -- note - changes in here should be reflected in get_next_state
  261.   begin
  262.     if (FULLTBL) then 
  263.       INDENT_PUTS(
  264.         "yy_current_state := yy_nxt(yy_current_state, yy_ch_buf(yy_cp));"); 
  265.       INDENT_PUTS("while ( yy_current_state > 0 ) loop"); 
  266.       INDENT_UP; 
  267.       INDENT_PUTS("yy_cp := yy_cp + 1;"); 
  268.       INDENT_PUTS(
  269.         "yy_current_state := yy_nxt(yy_current_state, yy_ch_buf(yy_cp));"); 
  270.       INDENT_DOWN; 
  271.       INDENT_PUTS("end loop;"); 
  272.  
  273.       if (NUM_BACKTRACKING > 0) then 
  274.         GEN_BACKTRACKING; 
  275.         TEXT_IO.NEW_LINE; 
  276.       end if; 
  277.  
  278.       TEXT_IO.NEW_LINE; 
  279.       INDENT_PUTS("yy_current_state := -yy_current_state;"); 
  280.     else 
  281.  
  282.       -- compressed
  283.       INDENT_PUTS("loop"); 
  284.  
  285.       INDENT_UP; 
  286.  
  287.       GEN_NEXT_STATE; 
  288.  
  289.       INDENT_PUTS("yy_cp := yy_cp + 1;"); 
  290.  
  291.       if (INTERACTIVE) then
  292.         TEXT_IO.PUT("if ( yy_base(yy_current_state) = ");
  293.         INT_IO.PUT(JAMBASE, 1);
  294.       else
  295.         TEXT_IO.PUT("if ( yy_current_state = "); 
  296.         INT_IO.PUT(JAMSTATE, 1); 
  297.       end if;
  298.       
  299.       TEXT_IO.PUT_LINE(" ) then"); 
  300.       TEXT_IO.PUT_LINE("    exit;"); 
  301.       TEXT_IO.PUT_LINE("end if;"); 
  302.  
  303.       INDENT_DOWN; 
  304.  
  305.       DO_INDENT; 
  306.  
  307.       TEXT_IO.PUT_LINE("end loop;"); 
  308.  
  309.       if (not INTERACTIVE) then
  310.         INDENT_PUTS("yy_cp := yy_last_accepting_cpos;"); 
  311.         INDENT_PUTS("yy_current_state := yy_last_accepting_state;"); 
  312.       end if;
  313.     end if; 
  314.   end GEN_NEXT_MATCH; 
  315.  
  316.   -- generate the code to find the next state
  317.  
  318.   procedure GEN_NEXT_STATE is 
  319.   -- note - changes in here should be reflected in get_next_match
  320.   begin
  321.     INDENT_UP; 
  322.     if (FULLTBL) then 
  323.       INDENT_PUTS("yy_current_state := yy_nxt(yy_current_state,"); 
  324.       INDENT_PUTS("                    yy_ch_buf(yy_cp));"); 
  325.       GEN_BACKTRACKING; 
  326.     else 
  327.       GEN_NEXT_COMPRESSED_STATE; 
  328.     end if; 
  329.   end GEN_NEXT_STATE; 
  330.  
  331.   -- generate the code to find the start state
  332.  
  333.   procedure GEN_START_STATE is 
  334.   begin
  335.     INDENT_PUTS("yy_current_state := yy_start;"); 
  336.  
  337.     if (BOL_NEEDED) then 
  338.       INDENT_PUTS("if ( yy_ch_buf(yy_bp-1) = ASCII.LF ) then"); 
  339.       INDENT_UP; 
  340.       INDENT_PUTS("yy_current_state := yy_current_state + 1;"); 
  341.       INDENT_DOWN; 
  342.       INDENT_PUTS("end if;"); 
  343.     end if; 
  344.  
  345.   end GEN_START_STATE; 
  346.  
  347.   -- gentabs - generate data statements for the transition tables
  348.  
  349.   procedure GENTABS is 
  350.     I, J, K, NACC, TOTAL_STATES : INTEGER; 
  351.     ACCSET, ACC_ARRAY           : INT_PTR; 
  352.     ACCNUM                      : INTEGER; 
  353.     END_OF_BUFFER_ACTION        : INTEGER := NUM_RULES + 1; 
  354.     -- *everything* is done in terms of arrays starting at 1, so provide
  355.     -- a null entry for the zero element of all C arrays
  356.  
  357.     C_LONG_DECL                 : STRING(1 .. 44) := 
  358.       "static const long int %s[%d] =\n    {   0,\n"; 
  359.     C_SHORT_DECL                : STRING(1 .. 45) := 
  360.       "static const short int %s[%d] =\n    {   0,\n"; 
  361.     C_CHAR_DECL                 : STRING(1 .. 40) := 
  362.       "static const char %s[%d] =\n    {   0,\n"; 
  363.   begin
  364.     ACC_ARRAY := ALLOCATE_INTEGER_ARRAY(CURRENT_MAX_DFAS); 
  365.     NUMMT := 0; 
  366.  
  367.     -- the compressed table format jams by entering the "jam state",
  368.     -- losing information about the previous state in the process.
  369.     -- In order to recover the previous state, we effectively need
  370.     -- to keep backtracking information.
  371.     NUM_BACKTRACKING := NUM_BACKTRACKING + 1; 
  372.  
  373.     DFAACC(END_OF_BUFFER_STATE).DFAACC_STATE := END_OF_BUFFER_ACTION; 
  374.  
  375.     for CNT in 1 .. LASTDFA loop
  376.       ACC_ARRAY(CNT) := DFAACC(CNT).DFAACC_STATE; 
  377.     end loop; 
  378.  
  379.  
  380.     ACC_ARRAY(LASTDFA + 1) := 0; 
  381.  
  382.     -- add accepting number for the jam state
  383.  
  384.     -- spit out ALIST array, dumping the accepting numbers.
  385.  
  386.     -- "lastdfa + 2" is the size of ALIST; includes room for arrays
  387.     -- beginning at 0 and for "jam" state
  388.     K := LASTDFA + 2; 
  389.  
  390.     TEXT_IO.PUT("yy_accept : constant array(0.."); 
  391.     INT_IO.PUT(K - 1, 1); 
  392.     TEXT_IO.PUT_LINE(") of short :="); 
  393.     TEXT_IO.PUT_LINE("    (   0,"); 
  394.     for CNT in 1 .. LASTDFA loop
  395.       MISC.MKDATA(ACC_ARRAY(CNT)); 
  396.  
  397.       if (TRACE and (ACC_ARRAY(CNT) /= 0)) then 
  398.         TEXT_IO.PUT(STANDARD_ERROR, "state # "); 
  399.         INT_IO.PUT(STANDARD_ERROR, CNT, 1); 
  400.         TEXT_IO.PUT(STANDARD_ERROR, " accepts: ["); 
  401.         INT_IO.PUT(STANDARD_ERROR, ACC_ARRAY(CNT), 1); 
  402.         TEXT_IO.PUT(STANDARD_ERROR, ']'); 
  403.         TEXT_IO.NEW_LINE(STANDARD_ERROR); 
  404.       end if; 
  405.     end loop; 
  406.  
  407.     -- add entry for "jam" state
  408.     MISC.MKDATA(ACC_ARRAY(LASTDFA + 1)); 
  409.  
  410.     MISC.DATAEND; 
  411.  
  412.     if (USEECS) then 
  413.       GENECS; 
  414.     end if; 
  415.  
  416.     if (USEMECS) then 
  417.  
  418.       -- write out meta-equivalence classes (used to index templates with)
  419.       if (TRACE) then 
  420.         TEXT_IO.NEW_LINE(STANDARD_ERROR); 
  421.         TEXT_IO.NEW_LINE(STANDARD_ERROR); 
  422.         TEXT_IO.PUT_LINE(STANDARD_ERROR, "Meta-Equivalence Classes:"); 
  423.       end if; 
  424.  
  425.       TEXT_IO.PUT("yy_meta : constant array(0.."); 
  426.       INT_IO.PUT(NUMECS, 1); 
  427.       TEXT_IO.PUT_LINE(") of short :="); 
  428.       TEXT_IO.PUT_LINE("    (   0,"); 
  429.       for CNT in 1 .. NUMECS loop
  430.         if (TRACE) then 
  431.           INT_IO.PUT(STANDARD_ERROR, CNT, 1); 
  432.           TEXT_IO.PUT(STANDARD_ERROR, " = "); 
  433.           INT_IO.PUT(STANDARD_ERROR, abs(TECBCK(CNT)), 1); 
  434.           TEXT_IO.NEW_LINE(STANDARD_ERROR); 
  435.         end if; 
  436.         MISC.MKDATA(abs(TECBCK(CNT))); 
  437.       end loop; 
  438.  
  439.       MISC.DATAEND; 
  440.     end if; 
  441.  
  442.     TOTAL_STATES := LASTDFA + NUMTEMPS; 
  443.  
  444.     TEXT_IO.PUT("yy_base : constant array(0.."); 
  445.     INT_IO.PUT(TOTAL_STATES, 1); 
  446.     if (TBLEND > MAX_SHORT) then 
  447.       TEXT_IO.PUT_LINE(") of integer :="); 
  448.     else 
  449.       TEXT_IO.PUT_LINE(") of short :="); 
  450.     end if; 
  451.     TEXT_IO.PUT_LINE("    (   0,"); 
  452.  
  453.     for CNT in 1 .. LASTDFA loop
  454.       declare
  455.         D : INTEGER := DEF(CNT); 
  456.       begin
  457.         if (BASE(CNT) = JAMSTATE_CONST) then 
  458.           BASE(CNT) := JAMBASE; 
  459.         end if; 
  460.  
  461.         if (D = JAMSTATE_CONST) then 
  462.           DEF(CNT) := JAMSTATE; 
  463.         else 
  464.           if (D < 0) then 
  465.  
  466.             -- template reference
  467.             TMPUSES := TMPUSES + 1; 
  468.             DEF(CNT) := LASTDFA - D + 1; 
  469.           end if; 
  470.         end if; 
  471.         MISC.MKDATA(BASE(CNT)); 
  472.       end; 
  473.     end loop; 
  474.  
  475.     -- generate jam state's base index
  476.     I := LASTDFA + 1; 
  477.     MISC.MKDATA(BASE(I)); 
  478.  
  479.     -- skip jam state
  480.     I := I + 1; 
  481.  
  482.     for CNT in I .. TOTAL_STATES loop
  483.       MISC.MKDATA(BASE(CNT)); 
  484.       DEF(CNT) := JAMSTATE; 
  485.     end loop; 
  486.  
  487.     MISC.DATAEND; 
  488.  
  489.     TEXT_IO.PUT("yy_def : constant array(0.."); 
  490.     INT_IO.PUT(TOTAL_STATES, 1); 
  491.     if (TBLEND > MAX_SHORT) then 
  492.       TEXT_IO.PUT_LINE(") of integer :="); 
  493.     else 
  494.       TEXT_IO.PUT_LINE(") of short :="); 
  495.     end if; 
  496.     TEXT_IO.PUT_LINE("    (   0,"); 
  497.  
  498.     for CNT in 1 .. TOTAL_STATES loop
  499.       MISC.MKDATA(DEF(CNT)); 
  500.     end loop; 
  501.  
  502.     MISC.DATAEND; 
  503.     TEXT_IO.PUT("yy_nxt : constant array(0.."); 
  504.     INT_IO.PUT(TBLEND, 1); 
  505.     if (LASTDFA > MAX_SHORT) then 
  506.       TEXT_IO.PUT_LINE(") of integer :="); 
  507.     else 
  508.       TEXT_IO.PUT_LINE(") of short :="); 
  509.     end if; 
  510.     TEXT_IO.PUT_LINE("    (   0,"); 
  511.  
  512.     for CNT in 1 .. TBLEND loop
  513.       if ((NXT(CNT) = 0) or (CHK(CNT) = 0)) then 
  514.         NXT(CNT) := JAMSTATE; 
  515.  
  516.       -- new state is the JAM state
  517.       end if; 
  518.       MISC.MKDATA(NXT(CNT)); 
  519.     end loop; 
  520.  
  521.     MISC.DATAEND; 
  522.  
  523.     TEXT_IO.PUT("yy_chk : constant array(0.."); 
  524.     INT_IO.PUT(TBLEND, 1); 
  525.     if (LASTDFA > MAX_SHORT) then 
  526.       TEXT_IO.PUT_LINE(") of integer :="); 
  527.     else 
  528.       TEXT_IO.PUT_LINE(") of short :="); 
  529.     end if; 
  530.     TEXT_IO.PUT_LINE("    (   0,"); 
  531.  
  532.     for CNT in 1 .. TBLEND loop
  533.       if (CHK(CNT) = 0) then 
  534.         NUMMT := NUMMT + 1; 
  535.       end if; 
  536.  
  537.       MISC.MKDATA(CHK(CNT)); 
  538.     end loop; 
  539.  
  540.     MISC.DATAEND; 
  541.   exception
  542.     when STORAGE_ERROR => 
  543.       MISC.AFLEXFATAL("dynamic memory failure in gentabs()"); 
  544.   end GENTABS; 
  545.  
  546.   -- write out a string at the current indentation level, adding a final
  547.   -- newline
  548.  
  549.   procedure INDENT_PUTS(STR : in STRING) is 
  550.   begin
  551.     DO_INDENT; 
  552.     TEXT_IO.PUT_LINE(STR); 
  553.   end INDENT_PUTS; 
  554.  
  555.   -- do_sect3_out - dumps section 3.
  556.  
  557.   procedure DO_SECT3_OUT is 
  558.     GARBAGE : TOKEN; 
  559.   begin
  560.     SCANNER.CALL_YYLEX := TRUE; 
  561.     GARBAGE := SCANNER.GET_TOKEN; 
  562.   end DO_SECT3_OUT; 
  563.  
  564.   -- make_tables - generate transition tables
  565.   --
  566.   --
  567.   -- Generates transition tables and finishes generating output file
  568.  
  569.   procedure MAKE_TABLES is 
  570.     DID_EOF_RULE      : BOOLEAN := FALSE; 
  571.     TRANS_OFFSET_TYPE : STRING(1 .. 7); 
  572.     TOTAL_TABLE_SIZE  : INTEGER := TBLEND + NUMECS + 1; 
  573.     BUF               : VSTRING; 
  574.   begin
  575.     if (not FULLTBL) then 
  576.  
  577.       -- if we used full tables this is already output
  578.       DO_SECT3_OUT; 
  579.  
  580.       -- intent of this call is to get everything up to ##
  581.       SKELETON_MANAGER.SKELOUT; 
  582.  
  583.     -- output YYLex code up to part about tables.
  584.     end if; 
  585.  
  586.     TEXT_IO.PUT("YY_END_OF_BUFFER : constant := "); 
  587.     INT_IO.PUT(NUM_RULES + 1, 1); 
  588.     TEXT_IO.PUT_LINE(";"); 
  589.  
  590.     INDENT_PUTS("subtype yy_state_type is integer;"); 
  591.     INDENT_PUTS("yy_current_state : yy_state_type;"); 
  592.  
  593.     -- now output the constants for the various start conditions
  594.     RESET(DEF_FILE, IN_FILE); 
  595.  
  596.     while (not TEXT_IO.END_OF_FILE(DEF_FILE)) loop
  597.       TSTRING.GET_LINE(DEF_FILE, BUF); 
  598.       TSTRING.PUT_LINE(BUF); 
  599.     end loop; 
  600.  
  601.     if (FULLTBL) then 
  602.       GENFTBL; 
  603.     else 
  604.       GENTABS; 
  605.     end if; 
  606.  
  607.     RESET(TEMP_ACTION_FILE, IN_FILE); 
  608.  
  609.     -- generate code for yy_get_previous_state
  610.     SET_INDENT(1); 
  611.     SKELETON_MANAGER.SKELOUT; 
  612.  
  613.     if (BOL_NEEDED) then 
  614.       INDENT_PUTS("yy_bp : integer := yytext_ptr;"); 
  615.     end if; 
  616.     SKELETON_MANAGER.SKELOUT; 
  617.  
  618.     GEN_START_STATE; 
  619.     SKELETON_MANAGER.SKELOUT; 
  620.     GEN_NEXT_STATE; 
  621.     SKELETON_MANAGER.SKELOUT; 
  622.  
  623.     SET_INDENT(2); 
  624.  
  625.     INDENT_PUTS("yy_bp := yy_cp;"); 
  626.  
  627.     GEN_START_STATE; 
  628.     GEN_NEXT_MATCH; 
  629.  
  630.     SKELETON_MANAGER.SKELOUT; 
  631.  
  632.     SET_INDENT(3); 
  633.     GEN_FIND_ACTION; 
  634.  
  635.     SET_INDENT(1); 
  636.     SKELETON_MANAGER.SKELOUT; 
  637.  
  638.     INDENT_UP; 
  639.     GEN_BT_ACTION; 
  640.  
  641.     MISC.ACTION_OUT; 
  642.     MISC.ACTION_OUT; 
  643.  
  644.     -- generate cases for any missing EOF rules
  645.     for I in 1 .. LASTSC loop
  646.       if (not SCEOF(I)) then 
  647.         DO_INDENT; 
  648.         if (not DID_EOF_RULE) then 
  649.           TEXT_IO.PUT("when "); 
  650.         else 
  651.           TEXT_IO.PUT_LINE("|"); 
  652.         end if; 
  653.         TEXT_IO.PUT("YY_END_OF_BUFFER + "); 
  654.         TSTRING.PUT(SCNAME(I)); 
  655.         TEXT_IO.PUT(" + 1 "); 
  656.         DID_EOF_RULE := TRUE; 
  657.       end if; 
  658.     end loop; 
  659.     if (DID_EOF_RULE) then 
  660.       TEXT_IO.PUT_LINE("=> "); 
  661.     end if; 
  662.  
  663.     if (DID_EOF_RULE) then 
  664.       INDENT_UP; 
  665.       INDENT_PUTS("return End_Of_Input;"); 
  666.       INDENT_DOWN; 
  667.     end if; 
  668.  
  669.     SKELETON_MANAGER.SKELOUT; 
  670.  
  671.     -- copy remainder of input to output
  672.     MISC.LINE_DIRECTIVE_OUT; 
  673.     DO_SECT3_OUT; 
  674.  
  675.   -- copy remainder of input, after ##, to the scanner file.
  676.   end MAKE_TABLES; 
  677.  
  678. end GEN; 
  679.